module klang.ir.转换工厂.转换输出.IR转换_;
import 全局;
import std.functional: ·fd = toDelegate;
import ··类型_ = klang.编译.类型.类型_;
import klang.编译.类型.类型_: 转换上下文_, 转换函数_, 输出解析器_, 转换支持_, 基工厂_ = 节点工厂_, 程序主机接口_;
import klang.编译.语法节点.节点_: 基础节点_ = 节点_, 基础源文件_ = 源文件_;
import klang.ir.语法节点.IR节点_: 源文件_ = IR源文件_;
import klang.ir.类型.IR类型_: ISK, 编译选项_;
import klang.编译.核心.核心_: 词典_, 整数_, 创建数组, 返回零值, 映射, 循环每个, 最小, 获取正规文件名函数_, 查找索引, 结尾包含;
import klang.ir.转换工厂.转换工具.IR转换工具_: 获取输出文件名;
源文件_ 当前源文件;
转换上下文_ 当前上下文;
输出解析器_ 输出解析;
编译选项_ 编译选项;
词典_!(dstring) 定义词典;
程序主机接口_ 主机;
static this() {
    定义词典 = new 词典_!(dstring)();
}
转换函数_!(基础节点_) 转换IR(转换上下文_ ct) {
    .当前上下文 = ct;
    .输出解析 = 当前上下文.getEmitResolver();
    .主机 = 输出解析.获取主机();
    .编译选项 = (cast(编译选项_)(主机.获取编译选项()));
    return cast(转换函数_!(基础节点_))(·fd(&.转换));
}
基础节点_[] 转换(基础节点_ n) {
    源文件_ s = (cast(源文件_)((cast(基础源文件_)(n))));
    if (s !is ··null!(源文件_)) {
        s.输出文件名 = 获取输出文件名(s, .主机, .编译选项, ".ir"d);
        return [s];
    }
    return ··null!(基础节点_[]);
}
